﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GitDiff
{
    class GitCommand
    {
        /// <summary>
        /// 启动Cmd
        /// </summary>
        /// <returns></returns>
        public string Exec(string strCommand)
        {
            string strResult = string.Empty;
            string output = string.Empty;

            if (string.IsNullOrWhiteSpace(strCommand))
                return string.Empty;

            try
            {
                #region CMD预设
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.UseShellExecute = false;        //是否使用操作系统shell启动
                p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息
                p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息
                p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出
                p.StartInfo.CreateNoWindow = true;         //不显示程序窗口
                p.Start();//启动程序
                #endregion

                //向cmd窗口发送输入信息
                //向标准输入写入要执行的命令。这里使用&是批处理命令的符号，表示前面一个命令不管是否执行成功都执行后面(exit)命令，如果不执行exit命令，后面调用ReadToEnd()方法会假死
                //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令，后者表示必须前一个命令执行失败才会执行后面的命令
                //p.StandardInput.WriteLine(strCommand + "&exit");
                p.StandardInput.WriteLine(strCommand + "&exit");
                p.StandardInput.AutoFlush = true;

                //获取cmd窗口的输出信息
                output = p.StandardOutput.ReadToEnd();

                p.WaitForExit();//等待程序执行完退出进程
                p.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            strResult = output;
            return strResult;
        }
    }
}
